.TITLE TTYHV .IDENT /08.12/ ; ; Copyright (c) 1995-1999 by Mentec Inc., U.S.A. ; All rights reserved. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ; 28-AUG-82 DALE R. DONCHIN ; ; MODIFICATIONS: ; ; S. C. ADAMS 19-MAY-89 8.0 ; SA497 -- DON'T USE OUTPUT TIMER ON DMA OUTPUT ; ; M. W. ZAHAREE 8-MAY-91 8.1 ; MWZ016 -- MAKE SURE INTERRUPTS ARE LOCKED OUT ; WHEN SETTING PARITY. CLEAN UP EXCESSIVE LOCKI ; CALLS. ; ; D. CARROLL 19-May-1993 8.11 ; DC214 -- Correct MWZ016 for unit online, and insure that ; YVMTMA is correctly used as a co-routine with ; LOCKI still in effect on return. ; ; D. CARROLL 17-May-1993 8.12 ; DC227 -- Allow buffers to reside in low memory (ICB pool) ; and be properly handled. ; ; ;+ ; CONTROLLER-DEPENDENT ROUTINES FOR DHU/DHV11. ;- ; ; .IF DF D$$V11 .MCALL UCBDF$ UCBDF$ ;DEFINE UCB SYMBOLS .IF DF R$$MPL .MCALL KRBDF$ KRBDF$ ;DEFINE KRB SYMBOLS .IFF ;R$$MPL .MCALL SCBDF$ SCBDF$ ;DEFINE SCB SYMBOLS .ENDC ;R$$MPL .PSECT MAP5 ; ; ; EQUATED SYMBOLS ; ; DHU/DHV11 REGISTER DEFINITIONS ; CSR = 0 ;CONTROL STATUS REGISTER RBUF = 2 ;RECEIVER BUFFER REGISTER TXCHAR = 2 ;TRANSMIT CHARACTER REGISTER LPR = 4 ;LINE PARAMETER REGISTER STAT = 6 ;LINE STATUS REGISTER FIFODT = 6 ;DHU FIFO DATA REGISTER FIFOSZ = 6 ;DHU FIFO SIZE REGISTER LNCTRL = 10 ;LINE CONTROL REGISTER BFADR1 = 12 ;TRANSMIT BUFFER ADDRESS 1 REGISTER BFADR2 = 14 ;TRANSMIT BUFFER ADDRESS 2 REGISTER BFCNT = 16 ;TRANSMIT DMA BUFFER COUNTER REGISTER ; ; DEFINITION FOR THE CONTROLLER ID BIT IN STAT REGISTER ; DHUID = 400 ; DHUID=0 INDICATES DHV11 ; DHUID=1 INDICATES DHU11 ; ;+ ; YVSTAX - START OUTPUT. ; NOTE - NON-BUFFERED OUTPUT CURRENTLY NOT SUPPORTED. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.TOP+2 BUFFER POINTER ; U.TOC BYTE COUNT ; ; OUTPUT: ; OUTPUT STARTED. ; U.TOP+2 UNCHANGED ; U.TOC UNCHANGED ; ; REGISTERS ALTERED: R4 ;- ; ; ; ; BUFFERED OUTPUT FOR ALL QIO, EXCEPT IO.WAL IS ALWAYS DONE FROM THE TERMINAL ; DRIVER BUFFERS. IN CASE OF IO.WAL FOR Q-BUS SYSTEMS OUTPUT MAY BE ; DONE FROM THE TASK BUFFER WITHOUT INTERMEDIATE TRANSFER INTO THE ; CHAIN OF USUAL TTDRV BUFFERS ; ONLY ONE INTERNAL TTDRV BUFFER IS USED FOR THIS TRANSFER. THIS BUFFER ; DOES NOT CONTAIN DATA. IT CONTAINS INFORMATION FOR DIRECT OUTPUT FROM ; THE TASK BUFFERS. ; ; OFFSETS ; ; 0 - LINK WORD (CONTAINS 0) ; 2 - LENGTH ; 4 - NUMBER OF BYTES FOR DMA TRANSFER ; 6 - HIGH BYTE OF TASK BUFFER ADDRESS ; 10 - LOW BYTES OF TASK BUFFER ADDRESS ; ; THE REST OF THE OUTPUT BUFFER IS NOT USED ; ; IN A REGULAR QIO WE HAVE AS MANY PHYSICAL DATA TRANSFERS AS WE HAVE INTERNAL ; OUTPUT BUFFERS CHAINED FOR TASK OUTPUT. FOR 'PURE' IO.WAL WE HAVE ONLY ONE ; PHYSICAL DATA TRANSFER ; .ENABL LSB ; YVSTAX::BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;HIGH PRIORITY OUTPUT REQUESTED? BEQ 7$ ;;;N -POSSIBLY BEGIN NORMAL PRIORITY OUTPUT BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT ALREADY IN PROGRESS? BEQ 8$ ;;;Y - DO HIGH PRIOR.OUTPUT AT NEXT INTERRUPT BIS #S5.HPO,U.TST5-U.TSTA(R5);;;SHOW BUSY DOING HIGH PRIOR. OUTPUT STAXH: CALL SELLIN ;;;SELECT THE LINE MOV R3,R4 ;;;COPY CSR ADDRESS BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU BEQ 2$ ;;;NO. THIS IS DHV TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE BEQ 8$ ;;;NO SPACE. EXIT ADD #FIFODT,R4 ;;;POINT TO FIFODT 2$: BIT #S5.XOF,U.TST5-U.TSTA(R5);;;OUTPUT XOF? BEQ 3$ ;;;NO BIC #S5.XOF,U.TST5-U.TSTA(R5);;;RESET INDICATION MOV YVXOFF,-(SP) ;;;SET XOFF BR 4$ ;;;GO ON 3$: BIC #S5.XON,U.TST5-U.TSTA(R5);;;RESET XON MOV YVXON,-(SP) ;;;SET XON 4$: CMP R3,R4 ;;;IF EQUAL - DHV BNE 5$ ;;;NO. THIS IS DHU MOV (SP)+,TXCHAR(R3);;;OUTPUT XON/XOFF FOR DHV BR 6$ ;;;ALL DONE 5$: MOVB (SP)+,(R4) ;;;OUTPUT XON/XOFF FOR DHU 6$: JMP 60$ ;;;INITIALIZE OUTPUT 7$: BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;HIGH PRIOR. OUTPUT ;;;IN PROGRESS? BEQ STAXN ;;;Y - DO NORMAL PRIOR. OUTPUT ON NEXT ;;;INTERRUPT 8$: JMP 70$ ;;;EXIT STAXN: ;;;REFERENCE LABEL .IF DF T$$ACD BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 10$ ;;;Y - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC STAXM: CALL SELLIN ;;;SELECT THE LINE CALL MOUT ;;;GET NEXT CHARACTER TO OUTPUT MOVB R2,U.ADMA-U.TSTA(R5) ;;;PUT CHARACTER IN DMA BUFFER BIS #100000,U.ADMA-U.TSTA(R5) ;;;SET TRANSMIT DATA VALID BIT JMP 50$ ;;;INITIATE THE OUTPUT .ENDC ;T$$ACD 10$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 STAX1: CALL SELLIN ;;;SELECT THE LINE BICB #200,BFADR2+1(R3) ;;;DISABLE THE XMITTER IN CASE WE'RE X-OFF'ED .IF DF T$$DMA BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK FOR IO.WAL IN PROGRESS BNE 48$ ;;;NO .ENDC ;T$$DMA MOV (R4),BFADR1(R3) ;;;SET VIRTUAL BUFFER ADDRESS (U.TOP+2) CLRB BFADR2(R3) ;;; CMP (R4)+,#120000 ;;;SET CC-C IF BUFFER IS IN PRIMARY POOL ; ; FOR 22-BIT SYSTEMS, CHECK FOR THE PRESENCE OF UMRS. THE CHECKING IS DIFFERENT ; FOR RSX-11M AND RSX-11M-PLUS. ; .IF DF M$$EXT .IF DF R$$MPL BIT #HF.UBM,$HFMSK ;;;UMRS EXIST? SET CC-Z IF NO .IFF ;R$$MPL BIT #177777,$UMRPT ;;;UMRS EXIST? SET CC-Z IF NO .ENDC ;R$$MPL .ENDC ;M$$EXT ; ; IN I/D SYSTEMS, BUFFERS CAN BE IN EITHER TTCOM OR PRIMARY POOL, EACH REQUIRING ; DIFFERENT RELOCATION CONSTANTS IF THERE ARE NO UMRS. FOR NON-I/D SYSTEMS WE ; ONLY NEED TO COMPUTE A PHYSICAL ADDRESS FOR BUFFERS IN THE DRIVER'S PRIVATE ; POOL FOR SYSTEMS WITHOUT UMRS. ; .IF DF K$$DAS BNE 30$ ;;;UMRS PRESENT - JUMP BLO 20$ ;;;BUFFER IN PRIMARY POOL - JUMP ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESS MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE 20$: .IF DF I$$CBP BIT #160000,-2(R4) ;;; IS THE BUFFER IS THE LOW 4.KW? BEQ 40$ ;;; IF EQ, YES, NO MATTER .ENDC ;DF,I$$CBP ADD RELCV+6,BFADR1(R3) ;;;ADD POOL RELOCATION CONSTANT MOVB RELCV+4,BFADR2(R3) ;;;(RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; BR 40$ ;;;JOIN COMMON CODE 30$: BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMP .IF DF T$$SPL SUB #20000,BFADR1(R3) ;;;FORCE BUFFER ADDRESS TO MAP THROUGH UMR 5 .ENDC ;T$$SPL .IFF ;K$$DAS .IF DF M$$EXT BNE 40$ ;;;UMRS PRESENT - JUMP .ENDC ;M$$EXT BLO 40$ ;;;BUFFER IN PRIMARY POOL - JUMP ADD RELCV+2,BFADR1(R3) ;;;ADD RELOCATION CONSTANT TO VIRTUAL ADDRESS MOVB RELCV,BFADR2(R3) ;;;(NOTE: RELCV MUST NOT HAVE BITS 6 AND 7 SET) ADCB BFADR2(R3) ;;; .ENDC ;K$$DAS 40$: MOV @R4,BFCNT(R3) ;;;SET BYTE COUNT BR 49$ ;;;DMA TRANSFER FROM INT. BUFFER .IF DF T$$DMA 48$: MOV R0,-(SP) ;;;SAVE R0 MOV R4,R0 ;;;NOW R0 POINTS U.TOP+2 ADD #U.TFOB-U.TOP-2,R0;;;SET R0 TO U.TFOB CLRB U.TOTI-U.TFOB(R0) ;;;DON'T TIME-OUT DMA OUTPUT MOV (R0),R0 ;;; CMP (R0)+,(R0)+ ;;;SET R0 AT THE BEGINNING OF BUFFER MOV (R0)+,BFCNT(R3) ;;;SET BYTE COUNT FOR DMA MOV (R0)+,BFADR2(R3);;;SET 6 HIGH BITS OF ADDR MOV (R0),BFADR1(R3);;;SET LOW 16 BITS OF ADDR MOV (SP)+,R0 ;;;RESTORE R0 .ENDC ;T$$DMA 49$: BISB #200,BFADR2(R3) ;;;ENABLE DMA TRANSFER ASSUME S2.CTS,100000 50$: TST 2(R5) ;;;OUTPUT STOPPED BY CTRL-S? BMI 70$ ;;;YES- DON'T RESUME OUTPUT ; ; ;+ ; YVRESX - RESUME OUTPUT. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 0 ;- ; ; YVRESX::CALL SELLIN ;;;SELECT THE LINE .IF DF T$$ACD BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT BNE 60$ ;;;Y - JUMP BIT #DHUID,STAT(R3) ;;;CHECK FOR DHU BEQ 55$ ;;;LINE IS DHV -> 55$ TSTB FIFOSZ(R3) ;;;IF DHU CHECK IF FIFO HAS SPACE BEQ 70$ ;;;NO SPACE. TRY NEXT TIME MOVB U.ADMA-U.TSTA(R5),FIFODT(R3) ;;;INITIATE SINGLE CHAR XFER BR 60$ ;;;INITIATE OUTPUT REGARDLESS OF XOFF STATE 55$: MOV U.ADMA-U.TSTA(R5),TXCHAR(R3);;;INITIATE SINGLE CHAR XFER .ENDC ;T$$ACD 60$: MOVB #200,BFADR2+1(R3) ;;;ENABLE THE TRANSMITTER .IF NDF D$$VMD YVMTIM:: .ENDC ;D$$VMD 70$: RETURN ; .DSABL LSB ; ; ;+ ; YVABOX - ABORT OUTPUT. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; ;- ; ; YVABOX:: .IF DF T$$ACD BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BEQ 10$ ;;;N - RETURN .ENDC ;T$$ACD BIT #S5.HPO,U.TST5-U.TSTA(R5);;;HIGH PRIORITY OUTPUT IN PROGRESS? BNE 10$ ;;;YES - DO NOT ABORT OUTPUT BITB #US.OIU,U.STS-U.TSTA(R5) ;;;OUTPUT IN PROGRESS? BNE 10$ ;;;N - JUMP CALL SELLIN ;;;SELECT THE LINE BIS #1,LNCTRL(R3) ;;;ABORT THE CURRENT DMA TRANSFER CMP (SP)+,#LOCKR ;;;REMOVE RETURN ADDRESS - WAS IT TO LOCKR? BNE 10$ ;;;N - JUMP MTPS #0 ;;;ALLOW INTERRUPTS TST (SP)+ ;REMOVE RETURN ADDRESS TO FORK ROUTINE 10$: RETURN ;RETURN WITHOUT SIGNALLING OUTPUT DONE ; ; ;+ ; YVSTOX - STOP OUTPUT. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; S2.CTS 1 ;- ; ; YVSTOX::CALL SELLIN ;;;SELECT THE LINE BICB #200,BFADR2+1(R3) ;;;CLEAR THE TRANSMITTER ENABLE BIT RETURN ;;; ; ; .IF DF T$$GMC!T$$SMC!D$$VMD ;+ ; YVLPAR - GET/SET LINE PARAMETERS. ; ; INPUT: ; R0 BIT 15: 0 = SET SPEED ; 1 = GET SPEED ; BIT 13: 1 = SET 7-BIT CHARACTER LENGTH ; BIT 12: 1 = CHECK IF 7-BIT CHARACTER IS SUPPORTED ; BIT 11: 1 = SET SPEED SELECTED BY AUTO-BAUD DETECT LOGIC ; BIT 10: 1 = SET DEVICE DEPENDENT SPEED ; (USED FOR SETTING PARITY) ; BIT 9: 1 = GET/SET ANSWER SPEED ; BIT 8: 0 = GET/SET RECEIVE SPEED ; 1 = GET/SET TRANSMIT SPEED ; IF SET SPEED: ; BITS 0-7: NEW SPEED PARAMETER (S.XXX SYMBOL) ; ; R1 Flow control status change flags. ; ; BIT 0: 1 = Enable input flow control. ; BIT 1: 1 = Disable input flow control. ; BIT 2: 1 = Enable output flow control. ; BIT 3: 1 = Disable output flow control. ; ; BITS 4-15: Reserved ; ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; ; OUTPUT: ; IF GET SPEED REQUESTED: ; R4 POINTER TO DHU/DHV11 SPEED TABLE ; CC-C 0 ; ; IF SET SPEED REQUESTED: ; CC-C 0 IF OK ; 1 IF ILLEGAL SPEED SPECIFIED ; ; NOTE THAT THIS ROUTINE CAN BE EXECUTED AT BOTH SYSTEM STATE (IN RESPONSE ; TO A SF.GMC OR SF.SMC QIO) AND FROM THE INPUT INTERRUPT SERVICE ROUTINE (FOR ; AUTO-BAUD DETECT). ; ;- ; ; ; YVLPAR:: TST R1 ;Called for flow control change? BEQ 5$ ;If EQ no - go on. RETURN ;Not processed for DZ. 5$: .IF DF T$$GMC ! T$$SMC BIT #20000,R0 ;CHECK IF WE VALIDATE 7-BIT CHAR. BEQ 7$ ;NO RETURN 7$: BIT #10000,R0 ;CHECK SET 7-BIT BEQ 8$ ;NO. SET SPEED-PARITY BR SETLN1 ;SET 7-BIT AND OTHER LINE PARAMETERS 8$: .ENDC ;T$$GMC ! T$$SMC .IF DF D$$VMD BIT #4000,R0 ;SET SPEED FOR AUTO-BAUD DETECT? BEQ 20$ ;N - JUMP BIT #2000,R0 ;DEVICE DEPENDENT SPEED? BNE 10$ ;Y - JUMP BIC #177400,R0 ;CLEAR UPPER BYTE MOVB SPDHV-1(R0),R0 ;GET DEVICE DEPENDENT SPEED BITS 10$: BIC #^C<17>,R0 ;CLEAR ALL BUT SPEED BITS MOV R0,R2 ;GET A COPY .IF DF R$$EIS ASH #4,R2 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .IFF ;R$$EIS CALL SHIFT4 ;SHIFT SPEED BITS TO TRANSMIT SPEED POSITION .ENDC ;R$$EIS BIS R0,R2 ;ADD IN RECEIVE SPEED BITS MOVB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED IN DATABASE BR SETLN1 ; AND SET NEW SPEED IN CONTROLLER 20$: ;REFERENCE LABEL .ENDC ;D$$VMD .IF DF T$$GMC&T$$SMC MOV R0,R4 ;SAVE INPUT PARAMETER SWAB R4 ;PUT FLAGS IN LOW ORDER BYTE BPL 30$ ;SET SPEED - JUMP .ENDC .IF DF T$$GMC MOV #SPDHV,R4 ;POINT TO DHU/DHV11 SPEED TABLE RETURN ;RETURN WITH CC-C = 0 .ENDC ;T$$GMC .IF DF T$$SMC!D$$VMD .IF NDF T$$GMC MOV R0,R4 ;SAVE INPUT PARAMETER SWAB R4 ;PUT FLAGS IN LOWER ORDER BYTE .ENDC ;NDF T$$GMC 30$: BIC #177400,R0 ;CLEAR R0 HIGH BYTE MOVB SPDHV-1(R0),R2 ;GET SPEED BITS SEC ;ASSUME ERROR BMI 40$ ;NOT A SUPPORTED SPEED - JUMP ASRB R4 ;SET ANSWER SPEED? BEQ 50$ ;N - JUMP .IF DF D$$VMD BICB #17,U.CW3+1-U.TSTA(R5) ;CLEAR OLD VALUE BISB R2,U.CW3+1-U.TSTA(R5) ;SET NEW ANSWER SPEED CLC ;SHOW SUCCESS .IFF ;D$$VMD SEC ;ATTEMPT TO SET ANSWER SPEED W/O MODEM SUPPORT .ENDC ;D$$VMD 40$: RETURN ; 50$: BCS 60$ ;TRANSMIT SPEED - JUMP BICB #17,U.CW3-U.TSTA(R5) ;CLEAR OLD RECEIVE SPEED BR 70$ ;JUMP TO SET NEW SPEED 60$: BICB #360,U.CW3-U.TSTA(R5) ;CLEAR OLD TRANSMIT SPEED .IF DF R$$EIS ASH #4,R2 ;SHIFT SPEED BITS TO PROPER POSITION .IFF ;R$$EIS CALL SHIFT4 ;SHIFT SPEED BITS TO PROPER POSITION .ENDC ;R$$EIS 70$: BISB R2,U.CW3-U.TSTA(R5) ;SET NEW SPEED BR SETLN1 ;;;GO AND LOAD INTO LPR .ENDC ;DF T$$SMC!D$$VMD .ENDC ;T$$GMC!T$$SMC!D$$VMD ; ;+ ; YVPWUP - POWER-UP. ; ; INPUT: ; REGISTERS R2-R5 STANDARD FOR CONTROLLER-DEPENDENT ROUTINE. ; U.STS SET UP FOR LOCAL LINE: ; US.CRW 0 ; US.DSB 0 ;- ; ; .ENABL LSB .IF DF R$$CON YVCONL::BIT #HF.UBM,$HFMSK ;UMRS PRESENT ON THIS SYSTEM? BEQ YVCPUP ;N - JUMP MOV #UMR5S,R0 ;GET ADDRESS OF SAVED UMR 5 MOV #UBMPR+<5*4>,R1 ;POINT AT UMR 5 MOV (R0)+,(R1)+ ;SET UP UMR 5 MOV (R0)+,(R1)+ ; .IF NDF T$$SPL MOV (R0)+,(R1)+ ;SET UP UMR 6 MOV (R0)+,(R1)+ ; .ENDC ;NDF T$$SPL YVCPUP:: .IFF ;R$$CON YVPWUP::TST R2 ;IS THIS LINE ZERO? BNE 30$ ;N - JUMP .IFTF ;R$$CON MOV #40,@R3 ;SET MASTER RESET 10$: BIT #40,@R3 ;IS RESET FUNCTION COMPLETE? BNE 10$ ;N - LOOP UNTIL DONE .IFT ;R$$CON BIT #20000,@R3 ;DID INTERNAL DIAGNOSTICS SUCCEED? BEQ 20$ ;Y - JUMP MOVB #IE.FHE,$SCERR ;INDICATE FATAL HARDWARE ERROR ON DEVICE RETURN .IFTF ;R$$CON 20$: MOV #40100,@R3 ;ENABLE INTERRUPTS .IFT ;R$$CON RETURN YVUONL:: YVUPUP:: .ENDC ;R$$CON 30$: CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE BIS #4,LNCTRL(R3) ;;;ENABLE RECEIVER FOR THIS LINE BISB #US.OIU,U.STS-U.TSTA(R5) ;;;SET OUTPUT INTERRUPT UNEXPECTED .IF DF T$$DMA BIT #HF.QB,$HFMSK ;;;CHECK FOR Q-BUS BEQ 33$ ;;;NO BIS #S5.DMA,U.TST5-U.TSTA(R5) ;;;SET BIT TELLING DHV/DHU IS DMA 33$: ;;;REFERENCE LABEL .ENDC ;T$$DMA .IF DF D$$VMD BIC #S5.ABP,U.TST5-U.TSTA(R5) ;;;RESET AUTO-BAUD MODE BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;REMOTE LINE? BEQ 40$ ;;;N - JUMP BISB #US.CRW,U.STS-U.TSTA(R5) ;;;SET WAITING FOR CARRIER FLAG MOV R3,-(SP) ;;;SAVE POSSIBLY MODIFIED REGISTER CALL YVMTMA ;;;SET MODEM STATUS CALL @(SP)+ ;;;CALL BACK THE CALLER (HLMTIM) MOV (SP)+,R3 ;;;RESTORE REGISTER .ENDC BR 40$ SETLN1: CALL LOCKI ;;; LOCK OUT INTERRUPTS 40$: MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS SETLIN: CALL SELLIN ;;;SELECT THE LINE SWAB R2 ;;;PUT SPEED BITS IN HIGH BYTE RORB R2 ;;;PUT PARITY ENABLE BIT IN PROPER POSITION BICB #^C<40>,R2 ;;;CLEAR ALL BUT PARITY ENABLE TST U.CW3-U.TSTA(R5) ;;;ODD PARITY? BMI 60$ ;;;Y - JUMP BIS #100,R2 ;;;N - SET TO EVEN PARITY 60$: BIT #140000,R2 ;;;TRANSMIT SPEED 134.5 BAUD OR LOWER? BNE 70$ ;;;N - JUMP BIS #200,R2 ;;;Y - SET TWO STOP BITS 70$: BIS #30,R2 ;;;SET EIGHT BIT CHARACTERS BIT #S5.CLN,U.TST5-U.TSTA(R5) ;;;CHECK 7-BIT CHARACTER BEQ 75$ ;;;NO LEAVE IT 8-BIT BIC #10,R2 ;;;SET 7-BIT 75$: MOV R2,LPR(R3) ;;;LOAD NEW LINE PARAMETERS ; ; ; WHEN RETURNING VIA COROUTINE "LOCKI", CC-C IS CLEARED ; RETURN ;RETURN .DSABL LSB .IF DF R$$CON YVCOFF:: CALL LOCKI ;LOCK OUT INTERRUPTS MOV #40,@R3 ;;;SET MASTER RESET RETURN YVUOFF:: CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE BIC #11004,LNCTRL(R3) ;;;DROP DTR, RTS AND DISABLE THE RECEIVER RETURN ;;;DROP PRIORITY .ENDC ;R$$CON ; ; ;+ ; INPUT INTERRUPT SERVICE ROUTINE. ;- ; ; DS.CHG = 70000 ;DATASET STATUS CHANGE CONDITION .ENABL LSB ; .IF DF R$$MPL $YVINP::TTSET$ YV ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL $DVINP::TTSET$ DV ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .IFTF ;R$$MPL 10$: MOV RBUF(R3),R5 ;;;GET NEXT CHARACTER FROM SILO BPL 70$ ;;;SILO IS EMPTY - JUMP MOV R5,-(SP) ;;;SAVE CHARACTER SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5 MOV (SP)+,R2 ;;;RETRIEVE CHAR + STATUS BCS 10$ ;;;BAD LINE - IGNORE CHARACTER MOV R2,-(SP) ;;;CHECK FOR DATASET STATUS CHANGE BIC #^C,@SP ;;;CLEAR ALL BUT ERROR BITS CMP #DS.CHG,(SP)+ ;;;DATASET STATUS CHANGE? BEQ 20$ ;;;Y - JUMP .IFF ;R$$MPL MOV R3,-(SP) ;;;SAVE CSR ADDRESS .IFTF ;R$$MPL MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS CALL ICHAR1 ;;;DO COMMON INPUT INTERRUPT PROCESSING MOV (SP)+,R4 ;;;RESTORE KRB/UCB ADDRESS .IFF ;R$$MPL MOV (SP)+,R3 ;;;RESTORE CSR .IFT ;R$$MPL MOV @R4,R3 ;;;RESTORE CSR ADDRESS .ENDC ;R$$MPL BR 10$ ;;;TRY TO GET ANOTHER CHARACTER FROM THE SILO ; ; WE ARE HERE BECAUSE FRAMING ERROR, DATA OVERRUN AND PARITY ERROR BITS WERE SET, ; WHICH MEANS THAT EITHER A DATASET STATUS CHANGE HAS OCCURRED OR A DIAGNOSTIC ; MESSAGE HAS BEEN RECEIVED ; 20$: BIT #1,R2 ;;;DIAGNOSTIC MESSAGE? BNE 10$ ;;;Y - IGNORE .IF DF D$$VMD ; ; PROCESS MODEM STATUS CHANGE ; MOV R4,-(SP) ;;;SAVE R4 MOV #100000,R4 ;;;SHOW THAT INTERFACE SUPPORTS DSR SIGNAL BIT #10,R2 ;;;IS CLEAR TO SEND SET? BEQ 30$ ;;;N - JUMP BIS #100,R4 ;;;Y - SET APPROPRIATE BIT 30$: BIT #20,R2 ;;;IS CARRIER DETECT SET? BEQ 40$ ;;;N - JUMP BIS #40,R4 ;;;Y - SET APPROPRIATE BIT 40$: BIT #40,R2 ;;;IS RING SET? BEQ 50$ ;;;N - JUMP BIS #200,R4 ;;;Y - SET APPROPRIATE BIT 50$: TSTB R2 ;;;IS DSR SET BPL 53$ ;;;N - JUMP BIS #40000,R4 ;;;Y - SET APPROPRIATE BIT 53$: CALL SELLIN ;;;SETUP THE CORRECT LINE CALL MODISR ;;;DO COMMON MODEM INTERRUPT PROCESSING BVC 57$ ;;;NO SPECIAL ACTION NEEDED - JUMP BCS 55$ ;;;DROP DTR - JUMP BIS #11000,LNCTRL(R3) ;;;RAISE DTR AND RTS BR 65$ ;;;AND TRY TO SERVICE ANOTHER LINE 55$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS 57$: BCS 65$ ;;;NO CALL ANSWERED - JUMP MOVB U.CW3+1-U.TSTA(R5),R2 ;;;GET ANSWER SPEED BICB #^C<17>,R2 ;;;CLEAR ALL BUT SPEED FIELD MOVB R2,U.CW3-U.TSTA(R5) ;;;SET NEW RECEIVE SPEED IN DATABASE .IF DF R$$EIS ASH #4,R2 ;;;SET TRANSMIT SPEED = ANSWER SPEED .IFF ;R$$EIS CALL SHIFT4 ;;;SET TRANSMIT SPEED = ANSWER SPEED .ENDC ;R$$EIS BISB R2,U.CW3-U.TSTA(R5) ;;;SET NEW TRANSMIT SPEED IN DATABASE MOV U.CW3-U.TSTA(R5),R2 ;;;GET NEW SPEED AND PARITY BITS ASSUME S4.ABD,100000 TST 6(R5) ;;;AUTO-BAUD SPEED DETECT ENABLED? BPL 60$ ;;;N - JUMP MOV #273,R2 ;;;Y - SET LINE TO 4800 BAUD 60$: CALL SETLIN ;;;SET LINE PARAMETERS 65$: MOV (SP)+,R4 ;;;RESTORE R4 .ENDC ;D$$VMD BR 10$ ;;;TRY TO GET A CHARACTER FROM THE INPUT SILO ; ; SILO IS NOW EMPTY. SEE IF CONTROLLER IS READY TO TRANSMIT ; 70$: MOV @R3,R5 ;;;XMIT READY SET? BMI 75$ ;;;Y - GO DO OUTPUT WORK RETURN ;;;RETURN ; ; ;+ ; OUTPUT INTERRUPT SERVICE ROUTINE. ;- ; ; .IF DF R$$MPL $YVOUT::TTSET$ YV ;;;SAVE R2, R3 AND SET UP: ;;; R3 = CSR ADDRESS ;;; R4 = KRB ADDRESS .IFF ;R$$MPL $DVOUT::TTSET$ DV ;;;SAVE R2,R3 AND SET UP ;;; R3 = CSR ;;; R4 = ADDRESS OF UCB LIST .ENDC ;R$$MPL MOV @R3,R5 ;;;GET INTERRUPTING LINE NUMBER AND STATUS BPL 10$ ;;;CHECK THAT THERE IS AN ACTION 75$: MOV R4,-(SP) ;;;SAVE KRB/UCB ADDRESS 80$: MOV R5,-(SP) ;;;SAVE INTERRUPTING LINE NUMBER AND STATUS SWAB R5 ;;;GET LINE NUMBER IN LOW BYTE CALL MUXUCB ;;;GET UCB IN R5 MOV (SP)+,R2 ;;;RETRIEVE TRANSMIT STATUS BCS 130$ ;;;BAD LINE - IGNORE .IF DF R$$CON BITB #US.OFL,U.ST2-U.TSTA(R5) ;;;OFFLINE? BNE 130$ ;;;Y - JUMP .ENDC ;R$$CON .IF DF T$$SPL MOV U.TAPR-U.TSTA(R5),@#KDSAR5 ;;;MAP UCBX MOV #120000,R4 ;;;SET VIRTUAL ADDRESS OF UCBX .IFF ;T$$SPL MOV U.TUX-U.TSTA(R5),R4 ;;;GET UCBX .ENDC ;T$$SPL ; ; WE'RE HERE BECAUSE AN OUTPUT REQUEST HAS COMPLETED OR WAS ABORTED ; CALL SELLIN ;;;SELECT THE LINE THAT INTERRUPTED ; ; TO MAKE LATER ERROR CHECKING EASIER, MERGE THE DMA ABORT BIT (BIT 0 OF ; THE LNCTRL CSR) WITH THE DMA ERROR BIT (ALREADY IN R2) ; ASL R2 ;;;SHIFT A ZERO INTO THE LOW-ORDER BISB LNCTRL(R3),R2 ;;;COMBINE ERROR BITS TOGETHER BIC #1,LNCTRL(R3) ;;;RESET ABORT BIT FOR NEXT TRANSFER ; ; CHECK IF XOFF/XON SHOULD BE OUTPUT NOW (POSSIBLY BETWEEN QIO OUTPUT BUFFERS) ; BIC #100000,R2 ;;;ASSUME DON'T NEED XOFF/XON OUTPUT BIT #S5.HPC,U.TST5-U.TSTA(R5) ;;;ANY HIGH PRIORITY REQUEST PENDING? BEQ 85$ ;;;N - JUMP CALL STAXH ;;;START HIGH PRIORITY OUTPUT BIS #100000,R2 ;;;REMEMBER THAT WE DID THIS ; ; PROCESS ANY ERRORS FROM PREVIOUS TRANSFER ; 85$: MOV R3,-(SP) ;;;SAVE CSR ADDRESS ASR R2 ;;;DID WE ABORT PREVIOUS TRANSFER? BCS 110$ ;;;Y - JUMP BIT #10000,R2 ;;;DID THE CONTROLLER ABORT PREVIOUS TRANSFER? BEQ 90$ ;;;N - JUMP MOVB #1,U.TOTI(R4) ;;;SET TIMER TO EXPIRE IN 1 SECOND BR 120$ ;;;WAIT UNTIL THEN TO COMPLETE OUTPUT ; ; DETERMINE WHAT TO DO NEXT ; 90$: TST R2 ;;;DID WE JUST START XOFF/XON OUTPUT? BMI 120$ ;;;Y - DON'T START ANY MORE OUTPUT BITB #US.OIU,U.STS-U.TSTA(R5) ;;;ANY QIO (OR ACD) OUTPUT PENDING? BNE 120$ ;;;N - JUMP ; ; WE HAVE NO OUTPUT IN PROGRESS BUT HAVE QIO OUTPUT TO DO. DETERMINE IF WE ; SHOULD START IT FROM THE BEGINNING (S5.HPO SET) OR CONTINUE IT (S5.HPO CLEAR) ; BIT #S5.HPO,U.TST5-U.TSTA(R5) ;;;JUST STARTING QIO OUTPUT? BEQ 95$ ;;;N - JUMP CALL STAXN ;;;BEGIN QIO OUTPUT DELAYED BY XOFF/XON BR 120$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE ; ; POSSIBLY CONTINUE (IF MORE BUFFERS OR CHARACTERS) QIO OR ACD OUTPUT ; 95$: ;;;REFERENCE LABEL .IF DF T$$ACD BIT #S2.OBF,2(R5) ;;;DOING BUFFERED OUTPUT? BNE 100$ ;;;Y - JUMP ADD #U.TOC,R4 ;;;POINT TO U.TOC DEC @R4 ;;;ANYTHING LEFT TO OUTPUT? BEQ 110$ ;;;N - JUMP CALL STAXM ;;;INITIATE ANOTHER TRANSFER BR 120$ ;;;CHECK IF ANOTHER TRANSFER HAS COMPLETED .ENDC ;T$$ACD 100$: ADD #U.TOP+2,R4 ;;;POINT TO U.TOP+2 .IF DF T$$DMA BIT #S5.DWA,U.TST5-U.TSTA(R5);;;CHECK IO.WAL COMPLETION BNE 110$ ;;;YES .ENDC ;T$$DMA 104$: CALL NXTOB ;;;GET NEXT OUTPUT BUFFER IF THERE IS ONE BEQ 110$ ;;;N - JUMP ; ; WE GOT ANOTHER OUTPUT BUFFER - START OUTPUTTING IT. ; TST -(R4) ;;;POINT TO U.TOP+2 MOV (SP)+,R3 ;;;GET CSR ADDRESS CALL STAX1 ;;;START OUTPUT BR 122$ ;;;CLEAR S5.HPO AND GO ON TO NEXT LINE 110$: BIC #S5.DWA,U.TST5-U.TSTA(R5);;;CLEAR DMA IO.WAL IN PROGRESS BIT CALL ODONE ;;;DO OUTPUT DONE PROCESSING 120$: MOV (SP)+,R3 ;;;RESTORE CSR POINTER 122$: BIC #S5.HPO,U.TST5-U.TSTA(R5) ;;;NO XOFF/XON OUTPUT IN PROGRESS ; ; ; SEE IF ANY OTHER LINE COMPLETED TRANSMIT ; 130$: MOV (SP),R4 ;;;RESTORE KRB/UCB ADDRESS MOV @R3,R5 ;;;XMIT READY SET? BMI 80$ ;;;Y - DO IT ALL OVER AGAIN TST (SP)+ ;;;CLEAN STACK JMP 10$ ;;;SEE IF ANY MORE INPUT WORK TO DO ; .DSABL LSB ; ; ; .IF NDF R$$EIS ; ; SUBROUTINE TO SHIFT R2 4 BIT POSITIONS TO THE LEFT FOR NON-EIS SYSTEMS ; SHIFT4: ASL R2 ;SHIFT ONCE ASL R2 ;TWICE ASL R2 ;THRICE ASL R2 ;LAST TIME RETURN .ENDC ;NDF R$$EIS ; ; SUBROUTINE TO SELECT LINE ON DHU/DHV11 ; ; SELLIN: MOV #40100,-(SP) ;;;INCLUDE INTERRUPT ENABLE BITS BISB U.UNIT-U.TSTA(R5),(SP) ;;;GET THE LINE NUMBER MOV (SP)+,@R3 ;;;SELECT THE LINE RETURN ;;; .IF DF D$$VMD ; ; ;+ ; YVMTIM - MODEM TIME-OUT ;- ; ; .ENABL LSB YVMTIM::CALL LOCKI ;LOCK OUT INTERRUPTS CALL SELLIN ;;;SELECT THE LINE BIT #U2.RMT,U.CW2-U.TSTA(R5) ;;;IS LINE REMOTE? BNE 10$ ;;;Y - JUMP BIC #400,LNCTRL(R3) ;;;SET LINK TYPE TO LOCAL BR 20$ ;;;PROCESS MODEM TIMEOUT ;+ ; Note: If this routine is called, it should be noted that ; if US.CRW is set, then the caller will be called back as a ; co-routine, since it is expected that LOCKI is the second address ; on the stack in routine HLMTIM. Currently, it is only referenced ; in subroutine YVUONL:, and it is hoped that this remains the rule. ;- YVMTMA: ;;;(LINE ALREADY SELECTED) 10$: BIS #400,LNCTRL(R3) ;;;SET LINK TYPE TO REMOTE 20$: CALL HLMTIM ;;;DO COMMON MODEM TIME-OUT PROCESSING BEQ 30$ ;;;IF EQ Z-BIT SET - DROP DTR AND RTS BIS #11000,LNCTRL(R3) ;;;ASSERT DTR AND RTS RETURN ;;; 30$: BIC #11000,LNCTRL(R3) ;;;DROP DTR AND RTS RETURN ;;; .DSABL LSB .ENDC ;D$$VMD .ENDC ;D$$V11 .END